`timescale 1ns / 1ps
/////////////////////////////////////////////////////////////////////////////
////                                                                     ////
//// Instituto Tecnologico de Costa Rica                                 ////
////                                                                     ////
//// Maquina estados finitos                                             ////
////                                                                     ////
//// Este archivo es parte del proyecto: Control de luces de semaforo    ////
//// http://repositorio-charmander.googlecode.com/svn/trunk/             ////
////                                                                     ////
//// Descripcion                                                         ////
//// Implementacion de un control de luces de semaforo como un proyecto  ////
//// del curso de Taller de Diseño Logico.                               ////
////                                                                     ////
//// Funcionamiento:                                                     ////
//// - Maquina de estados del Controlador  de Luces. En este modulo es   ////
////   donde se procesan y se da la toma de decisiones por parte del     ////
////   programa para saber a que estado debera pasar segun las valores   ////
////   que ingresen.                                                     ////
////                                                                     ////
////                                                                     ////                                    
//// Autores:                                                            ////
//// - Gia Chen, kathya0812@gmail.com                                    ////
////   Edgar Rojas, edtec217@gmail.com                                   ////
////                                                                     ////
/////////////////////////////////////////////////////////////////////////////

module MaquinaEstadosFinitos( _clk_i, termino_i, fallo_i, _rst_i,
										led_leer_o, led_escribir_o, led_OK_o, led_fallo_o, escriba_o, lea_o);
	//ENTRADAS
	//Clock
	input _clk_i;
	//Señales de distintos módulos
	input termino_i;
	input fallo_i;
	//RESET
	input _rst_i;
	
	//SALIDAS
	//Luces del semáforo
	output reg led_leer_o, led_escribir_o, led_OK_o, led_fallo_o;
	//Señales a distintos módulos
	output reg escriba_o;
	output reg lea_o;
	
	//Contador
	reg[1:0] contador;
	
	//WIRES
	reg[2:0] estado_actual = 0;

	always @(posedge _clk_i)
		begin
			case(estado_actual)
				//ESTADO 0
				3'd0:
					begin
						contador = 0;
						led_leer_o <= 1;
						led_escribir_o <= 1;
						led_OK_o <= led_OK_o;
						led_fallo_o <= led_fallo_o;
						
						escriba_o <= 0;
						lea_o <= 0;
						
						if(_rst_i)
							begin
								estado_actual <= 1;
							end
					end
					
				//ESTADO 1
				3'd1:
					begin
						if(contador == 2)
							begin
								contador = 0;
								led_leer_o <= 1;
								led_escribir_o <= 0;
								led_OK_o <= 1;
								led_fallo_o <= 1;
								
								escriba_o <= 1;
								lea_o <= 0;
								
								if(termino_i)
									begin
										estado_actual <= 2;
									end
							end
						else
						begin
								contador = contador + 1;
						end
					end
					
				//ESTADO 2
				3'd2:
					begin
						if(contador == 2)
							begin
								contador = 0;
								led_leer_o <= 0;
								led_escribir_o <= 1;
								led_OK_o <= 1;
								led_fallo_o <= 1;
								
								escriba_o <= 0;
								lea_o <= 1;
								
								if(termino_i && ~fallo_i)
									begin
										estado_actual <= 3;
									end
								else if(termino_i && fallo_i)
									begin
										estado_actual <= 4;
									end
							end
						else 
						begin
							contador = contador + 1;
						end
					end
					
				//ESTADO 3
				3'd3:
					begin
						led_leer_o <= 1;
						led_escribir_o <= 1;
						led_OK_o <= 0;
						led_fallo_o <= 1;
						
						escriba_o <= 0;
						lea_o <= 0;
						
						estado_actual <= 0;
					end
					
				//ESTADO 4
				3'd4:
					begin
						led_leer_o <= 1;
						led_escribir_o <= 1;
						led_OK_o <= 1;
						led_fallo_o <= 0;
						
						escriba_o <= 0;
						lea_o <= 0;
						
						estado_actual <= 0;
					end

				default 
					begin
						led_leer_o <= 1;
						led_escribir_o <= 1;
						led_OK_o <= 1;
						led_fallo_o <= 1;
						
						escriba_o <= 0;
						lea_o <= 0;

						estado_actual <= 0;
					end
			endcase
		end
endmodule
